/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package facades;

import entities.C;
import entities.Producto;
import entities.SerieTallaje;
import entities.Temporada;
import entities.interfaces.PedidoInterfaz;
import java.util.List;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author damfercer
 */
@Stateless
public class ProductoFacade extends AbstractFacade<Producto> {
    @PersistenceContext(unitName = "CorporatePU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public ProductoFacade() {
        super(Producto.class);
    }
    
    public Boolean existeProducto(Producto p){
        Boolean res=true;
        Query q=em.createNamedQuery("Producto.findByCamposObligatiorios");
        q.setParameter("d", p.getD());
        q.setParameter("c", p.getC());
        q.setParameter("s", p.getS());
        q.setParameter("descripcion", p.getDescripcion());
        q.setParameter("color", p.getColor());
        q.setParameter("sexo", p.getSexo());
        q.setParameter("serieTallaje", p.getSerieTallaje());
        q.setParameter("temporada", p.getTemporada());
        List<Producto> productos=q.getResultList();
        return !productos.isEmpty();
    }
    
    public List<Producto> getProductosDePedidoSerieTallajeYC(PedidoInterfaz p, C c, SerieTallaje serieTallaje){
        Query q=null;
        if(p.getClass().getName().equals("entities.Pedido")){
            q=em.createNamedQuery("Producto.findByPedidoYCYSerieTallaje");
        }
        else if(p.getClass().getName().equals("entities.PedidoFabrica")){
            q=em.createNamedQuery("Producto.findByPedidoFabricaYCYSerieTallaje");
        }
        q.setParameter(1, p.getId());
        q.setParameter(2, c.getIdC());
        q.setParameter(3, serieTallaje.getIdSerieTallaje());
        return q.getResultList();
    }
        
    public List<Producto> getProductosDeSerieTallajeYC(PedidoInterfaz p, C c, SerieTallaje serieTallaje, String sql){
        StringBuilder sb=new StringBuilder();
        sb.append("SELECT DISTINCT producto.* FROM producto, c, serie_tallaje WHERE producto.C=c.ID_C AND producto.SERIE_TALLAJE=serie_tallaje.ID_SERIE_TALLAJE AND producto.C=");
        sb.append(c.getIdC());
        sb.append(" AND serie_tallaje.ID_SERIE_TALLAJE=");
        sb.append(serieTallaje.getIdSerieTallaje());
        sb.append(" AND producto.ID_PRODUCTO NOT IN (SELECT PRODUCTO FROM producto_talla,");
        if(p.getClass().getName().equals("entities.Pedido")){
            sb.append("linea_pedido WHERE linea_pedido.PRODUCTO_TALLA=producto_talla.ID_PRODUCTO_TALLA AND linea_pedido.PEDIDO=");        
        }
        else if(p.getClass().getName().equals("entities.PedidoFabrica")){
            sb.append("linea_pedido_fabrica WHERE linea_pedido_fabrica.PRODUCTO_TALLA=producto_talla.ID_PRODUCTO_TALLA AND linea_pedido_fabrica.PEDIDO_FABRICA=");
        }
        sb.append(p.getId());
        sb.append(")");
        sb.append(sql);
        Query q=em.createNativeQuery(sb.toString(), Producto.class);
        List<Producto> productos=q.getResultList();
        return productos;
    }
    
    public List<Producto> filtrarProductos(String sql){
        StringBuilder sb=new StringBuilder();
        sb.append("SELECT DISTINCT producto.* FROM producto WHERE 1");
        sb.append(sql);
        Query q=em.createNativeQuery(sb.toString(), Producto.class);
        List<Producto> productos=q.getResultList();
        return productos;
    }
    
    public List<Producto> getProductosDeTemporada(Temporada temporada){
        Query q=em.createNamedQuery("Producto.findByIdTemporada",Producto.class);
        q.setParameter("idTemporada", temporada.getIdTemporada());
        return q.getResultList();
    }
    
    public Boolean serieTallajeModificada(Producto producto){
        Query q=em.createNamedQuery("Producto.comprobarSerieTallaje", Producto.class);
        q.setParameter("idProducto", producto.getIdProducto());
        q.setParameter("idSerieTallaje", producto.getSerieTallaje().getIdSerieTallaje());
        List<Producto> list=q.getResultList();
        return list.isEmpty();
    }
    
    public Producto getUltimoProducto(){
        Producto p=null;
        Query q=em.createNamedQuery("Producto.findLastProduct", Producto.class);
        q.setMaxResults(1);
        List<Producto> productos=q.getResultList();
        if(!productos.isEmpty()){
           p=productos.iterator().next(); 
        }
        return p;
    }
    
}
